Õppige selgeks Django vahemälu! Juhend hõlmab vahemälu tagalaid, seadeid, malli fragmentide vahemällu salvestamist ja parimaid praktikaid optimaalseks veebirakenduse toimimiseks.
Pythoni Django vahemälu: põhjalik juhend vahemälu raamistiku integreerimiseks
Vahemälu kasutamine on veebirakenduste jõudluse ja skaleeritavuse parandamiseks fundamentaalne tehnika. Salvestades sageli ligipääsetavaid andmeid vahemällu, saate vähendada koormust oma andmebaasile ja serverile, mille tulemuseks on kiiremad vastuseajad ja parem kasutajakogemus. Django, kõrgetasemeline Pythoni veebiraamistik, pakub võimsat ja paindlikku vahemälu raamistikku, mis võimaldab teil hõlpsasti vahemälu oma rakendustesse integreerida.
Miks kasutada vahemälu Djangos?
Enne Django vahemälu detailidesse süvenemist uurime selle pakutavaid peamisi eeliseid:
- Paranenud jõudlus: Vahemälu vähendab andmebaasipäringute ja muude kulukate operatsioonide arvu, mis toob kaasa oluliselt kiiremad lehe laadimise ajad.
- Vähenenud andmebaasi koormus: Andmete serveerimisega vahemälust vähendate koormust oma andmebaasiserverile, võimaldades sellel käsitleda rohkem päringuid.
- Suurenenud skaleeritavus: Vahemälu võimaldab teie rakendusel käsitleda suuremat liiklusmahtu, ilma et oleks vaja kulukaid riistvara uuendusi.
- Parem kasutajakogemus: Kiiremad vastuseajad toovad kaasa sujuvama ja nauditavama kasutajakogemuse, suurendades kasutajate kaasatust ja rahulolu.
Django vahemälu raamistik: ülevaade
Django vahemälu raamistik pakub ühtset liidest erinevate vahemälu tagalaitega suhtlemiseks. See pakub erinevaid vahemälu tasemeid, võimaldades teil vahemällu salvestada terveid saite, üksikuid vaateid või konkreetseid malli fragmente.
Vahemälu tagalad
Vahemälu tagala on aluseks olev salvestusmehhanism, mida kasutatakse vahemällu salvestatud andmete hoidmiseks. Django toetab mitmeid sisseehitatud vahemälu tagalaid, samuti kolmandate osapoolte tagalaid, mida saab hõlpsasti integreerida.
- Memcached: Suure jõudlusega, hajutatud mäluobjektide vahemällu salvestamise süsteem. See sobib ideaalselt sageli ligipääsetavate andmete mäluvahemällu salvestamiseks.
- Redis: Mäluandmestruktuuride hoidla, mida kasutatakse andmebaasi, vahemälu ja sõnumimassiivina. Redis pakub Memcachedist arenenumaid funktsioone, nagu andmete püsivus ja pub/sub sõnumite edastus.
- Andmebaasi vahemällu salvestamine: Kasutab teie andmebaasi vahemälu tagalana. See sobib arenduseks või väikesemahulisteks juurutusteks, kuid jõudluse piirangute tõttu ei soovitata seda tavaliselt tootmiskeskkondades.
- Failipõhine vahemällu salvestamine: Salvestab vahemällu salvestatud andmed failisüsteemi failidesse. See on veel üks võimalus arenduseks või väikesemahulisteks juurutusteks, kuid see ei sobi suure liiklusega veebisaitidele.
- Kohaliku mälu vahemällu salvestamine: Salvestab vahemällu salvestatud andmed serveri mällu. See on kiireim variant, kuid see ei sobi mitmeserverilistesse keskkondadesse.
Vahemälu seaded
Django vahemälu seaded konfigureeritakse failis `settings.py`. Seade `CACHES` on sõnastik, mis määratleb iga vahemälu tagala konfiguratsiooni. Siin on näide Memcachedi konfigureerimisest:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
}
}
See konfiguratsioon käsib Djangol kasutada Memcachedi vahemälu tagalat ja ühenduda Memcachedi serveriga, mis töötab aadressil `127.0.0.1` (localhost) pordil `11211`. Saate konfigureerida mitu vahemälu tagalat ja määrata neile erinevad nimed.
Vahemälu põhikasutus
Django pakub lihtsat API-t vahemäluga suhtlemiseks. Andmete vahemällu panemiseks, hankimiseks ja kustutamiseks vahemälust saate kasutada objekti `cache` moodulist `django.core.cache`.
from django.core.cache import cache
# Set a value in the cache
cache.set('my_key', 'my_value', 300) # Salvesta 300 sekundiks
# Get a value from the cache
value = cache.get('my_key') # Tagastab 'my_value', kui võti eksisteerib, vastasel juhul None
# Delete a value from the cache
cache.delete('my_key')
Vahemällu salvestamise strateegiad Djangos
Django pakub mitmeid vahemällu salvestamise strateegiaid, mis vastavad erinevatele vajadustele ja rakenduste arhitektuuridele. Uurime kõige levinumaid lähenemisviise:
Saidipõhine vahemällu salvestamine
Saidipõhine vahemällu salvestamine paigutab kogu veebisaidi vastuse vahemällu. See on vahemällu salvestamise lihtsaim vorm ja võib oluliselt parandada staatiliste veebisaitide või harva muutuva sisuga veebisaitide jõudlust. Saidipõhise vahemällu salvestamise lubamiseks peate lisama `UpdateCacheMiddleware` ja `FetchFromCacheMiddleware` oma `MIDDLEWARE` seadesse failis `settings.py`. Oluline on õige järjekord. `UpdateCacheMiddleware` peab olema esimene ja `FetchFromCacheMiddleware` viimane.
MIDDLEWARE = [
'django.middleware.cache.UpdateCacheMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware',
]
Samuti peate konfigureerima seaded `CACHE_MIDDLEWARE_ALIAS` ja `CACHE_MIDDLEWARE_SECONDS`, et määrata vastavalt vahemälu tagala ja vahemälu aegumisaeg.
CACHE_MIDDLEWARE_ALIAS = 'default'
CACHE_MIDDLEWARE_SECONDS = 600 # Vahemällu 10 minutiks
Oluline märkus: Saidipõhine vahemällu salvestamine ei sobi üldjuhul dünaamilise sisuga või isikupärastatud kasutajakogemusega veebisaitidele, kuna see võib viia ebaõige või aegunud teabe kuvamiseni.
Vaatepõhine vahemällu salvestamine
Vaatepõhine vahemällu salvestamine võimaldab teil vahemällu salvestada üksikute vaadete väljundi. See on detailsem lähenemisviis kui saidipõhine vahemällu salvestamine ja sobib veebisaitidele, millel on nii staatilist kui ka dünaamilist sisu.
Vaatepõhise vahemällu salvestamise saate lubada, kasutades dekoraatorit `cache_page`:
from django.views.decorators.cache import cache_page
@cache_page(60 * 15) # Vahemällu 15 minutiks
def my_view(request):
# ...
return render(request, 'my_template.html', {'data': data})
`cache_page` dekoraator võtab argumendiks vahemälu aegumise aja sekundites. See salvestab vaate genereeritud kogu vastuse vahemällu, sealhulgas malli ja muud andmed.
Malli fragmentide vahemällu salvestamine
Malli fragmentide vahemällu salvestamine võimaldab teil vahemällu salvestada malli konkreetseid osi. See on kõige detailsem vahemällu salvestamise lähenemisviis ja sobib veebisaitidele, millel on väga dünaamiline sisu, kus ainult teatud osad lehest tuleb vahemällu salvestada.
Malli fragmentide vahemällu salvestamise kasutamiseks peate laadima mallis `cache` mallisildistiku teegi:
{% load cache %}
Seejärel saate kasutada `cache` silti, et ümbritseda malli fragment, mida soovite vahemällu salvestada:
{% cache 500 sidebar %}
<!-- KĂĽlgriba sisu -->
<ul>
{% for item in sidebar_items %}
<li>{{ item.title }}</li>
{% endfor %}
</ul>
{% endcache %}
`cache` silt võtab kaks argumenti: vahemälu aegumise aja sekundites ja vahemälu võtme eesliite. Vahemälu võtme eesliidet kasutatakse vahemällu salvestatud fragmendi identifitseerimiseks. Kui on vaja muuta konteksti, kasutage parameetrit `vary on` järgmiselt:
{% cache 500 sidebar item.id %}
<!-- KĂĽlgriba sisu -->
<ul>
{% for item in sidebar_items %}
<li>{{ item.title }}</li>
{% endfor %}
</ul>
{% endcache %}
Django genereerib automaatselt iga fragmendi jaoks unikaalse vahemälu võtme, mis põhineb eesliitel ja kõikidel fragmendis kasutatud muutujatel. Malli renderdamisel kontrollib Django, kas fragment on juba vahemällu salvestatud. Kui see on, siis toob Django fragmendi vahemälust ja lisab selle malli. Vastasel juhul renderdab Django fragmendi ja salvestab selle vahemällu edaspidiseks kasutamiseks.
Näide: Rahvusvaheline uudisteveebisait
Kujutage ette rahvusvahelist uudisteveebisaiti, mis kuvab uudisteartikleid, ilmateateid ja aktsiakursse. Uudisteartikleid ja ilmateateid uuendatakse sageli, samas kui aktsiakursse uuendatakse harvem. Selles stsenaariumis saab malli fragmentide vahemällu salvestamist kasutada aktsiakursi fragmendi vahemällu salvestamiseks, vähendades aktsiakursi serveri koormust.
{% load cache %}
<div class="news-article">
<h2>{{ article.title }}</h2>
<p>{{ article.content }}</p>
</div>
<div class="weather-forecast">
<h3>Ilmateade</h3>
<p>{{ weather.temperature }}°C</p>
<p>{{ weather.description }}</p>
</div>
{% cache 3600 stock_quotes %}
<div class="stock-quotes">
<h3>Aktsiakursid</h3>
<ul>
{% for quote in stock_quotes %}
<li>{{ quote.symbol }}: {{ quote.price }}</li>
{% endfor %}
</ul>
</div>
{% endcache %}
Vahemälu tühistamine
Vahemälu tühistamine on aegunud andmete vahemälust eemaldamise protsess. On ülioluline tagada, et vahemälu sisaldab kõige ajakohasemat teavet. Django pakub mitmeid tehnikaid vahemälu tühistamiseks:
- Ajapõhine aegumine: Vahemällu salvestatud andmetele aegumisaja seadmine tagab, et need eemaldatakse vahemälust automaatselt pärast teatud perioodi. See on vahemälu tühistamise lihtsaim vorm.
- Käsitsi tühistamine: Vahemälu kirjeid saate käsitsi tühistada, kasutades meetodit `cache.delete()`. See on kasulik, kui peate teatud sündmuste alusel tühistama konkreetseid vahemälu kirjeid.
- Signaalipõhine tühistamine: Saate kasutada Django signaaliraamistikku vahemälu kirjete tühistamiseks, kui teatud mudeleid luuakse, uuendatakse või kustutatakse. See tagab, et vahemälu uuendatakse automaatselt iga kord, kui aluseks olevad andmed muutuvad.
- Versioonimise kasutamine: Lisage vahemälu võtmesse versiooninumber. Kui aluseks olevad andmed muutuvad, suurendage versiooninumbrit. See sunnib Djangot tooma värskendatud andmed andmebaasist.
Signaalipõhise vahemälu tühistamise näide
Oletame, et teil on mudel `Product` ja soovite vahemälu tühistada iga kord, kui toode luuakse, uuendatakse või kustutatakse. Selle saavutamiseks saate kasutada Django signaale.
from django.db.models.signals import post_save, post_delete
from django.dispatch import receiver
from django.core.cache import cache
from .models import Product
@receiver(post_save, sender=Product)
def product_saved(sender, instance, **kwargs):
cache.delete('product_list') # Tühista toodete loendi vahemälu
cache.delete(f'product_detail_{instance.id}') # tühista toote detaili vahemälu
@receiver(post_delete, sender=Product)
def product_deleted(sender, instance, **kwargs):
cache.delete('product_list') # Tühista toodete loendi vahemälu
cache.delete(f'product_detail_{instance.id}') # tühista toote detaili vahemälu
See kood registreerib kaks signaalivastuvõtjat: ühe `post_save` signaali jaoks ja ühe `post_delete` signaali jaoks. Iga kord, kui `Product` objekt salvestatakse või kustutatakse, kutsutakse vastav signaalivastuvõtja ja see tühistab `product_list` vahemälu kirje. See tagab, et toodete loend on alati ajakohane.
Oluline märkus: Vahemälu tühistamine võib olla keeruline ülesanne, eriti hajutatud keskkondades. Oluline on hoolikalt kaaluda oma rakenduse andmete järjepidevuse nõudeid ja valida sobiv tühistamisstrateegia.
Parimad praktikad Django vahemälu kasutamiseks
Et oma Django rakendustes vahemälu tõhusalt kasutada, kaaluge järgmisi parimaid praktikaid:
- Tuvasta vahemällu salvestamise võimalused: Analüüsige oma rakenduse jõudlust ja tuvastage valdkonnad, kus vahemälu kasutamine võib kõige suuremat mõju avaldada. Keskenduge sageli ligipääsetavate andmete ja kulukate operatsioonide vahemällu salvestamisele.
- Valige õige vahemälu tagala: Valige vahemälu tagala, mis vastab teie rakenduse nõuetele jõudluse, skaleeritavuse ja andmete püsivuse osas. Memcached ja Redis on tootmiskeskkondades üldiselt head valikud.
- Määrake sobivad aegumisajad: Kaaluge hoolikalt vahemällu salvestatud andmete aegumisaegu. Liiga lühikesed aegumisajad võivad vahemälu eelised nullida, samas kui liiga pikad aegumisajad võivad viia aegunud andmeteni.
- Rakendage tõhus vahemälu tühistamine: Töötage välja usaldusväärne vahemälu tühistamise strateegia, et tagada vahemälu sisaldus alati kõige ajakohasema teabega.
- Jälgige vahemälu jõudlust: Jälgige oma vahemälu jõudlust, et tuvastada potentsiaalseid probleeme ja optimeerida selle konfiguratsiooni. Kasutage vahemälu statistikat vahemälu tabamismäärade ja vahemälu tühjendamise määrade jälgimiseks.
- Kasutage API-punktide jaoks vahemälu versioonimist: API-dega tegelemisel rakendage versioonimist ja lisage versiooninumber vahemälu võtmesse. See võimaldab teil hõlpsasti vahemälu tühistada, kui avaldate API uue versiooni.
- Kaaluge sisuedastusvõrgu (CDN) kasutamist: Staatiliste varade, nagu pildid, CSS-failid ja JavaScripti failid, puhul kaaluge CDN-i kasutamist oma sisu levitamiseks mitme serveri kaudu üle maailma. See võib oluliselt parandada lehe laadimise aegu kasutajate jaoks erinevates geograafilistes asukohtades.
Näide: Keeruka andmebaasipäringu vahemällu salvestamine
Oletame, et teil on keeruline andmebaasipäring, mis toob välja toodete loendi mitme kriteeriumi alusel. See päring võib olla aeglane ja ressursimahukas. Saate selle päringu tulemused vahemällu salvestada, et jõudlust parandada.
from django.core.cache import cache
from .models import Product
def get_products(category, price_range, availability):
cache_key = f'products_{category}_{price_range}_{availability}'
products = cache.get(cache_key)
if products is None:
products = Product.objects.filter(
category=category,
price__range=price_range,
availability=availability
)
cache.set(cache_key, products, 3600) # Vahemällu 1 tunniks
return products
See kood konstrueerib esmalt vahemälu võtme päringuparameetrite alusel. Seejärel kontrollib see, kas tulemused on juba vahemällu salvestatud. Kui on, toob see tulemused vahemälust. Vastasel juhul käivitab see andmebaasipäringu, salvestab tulemused vahemällu ja tagastab need.
Täpsemad vahemällu salvestamise tehnikad
Django vahemälu raamistik toetab ka täpsemaid vahemällu salvestamise tehnikaid, näiteks:
- Varying on Request Headers (Päringu päiste järgi varieerumine): Saate konfigureerida vahemälu oma väljundit varieerima konkreetsete päringupäiste, näiteks `Accept-Language` päise alusel. See võimaldab teil serveerida erinevat vahemällu salvestatud sisu vastavalt kasutaja keele-eelistusele. See tehakse `Vary: Accept-Language` päise abil.
- Vahemälu võtme eesliidete kasutamine: Saate kasutada vahemälu võtme eesliiteid, et rühmitada seotud vahemälu kirjed kokku. See hõlbustab mitme vahemälu kirje korraga tühistamist.
- Integreerimine kolmandate osapoolte vahemällu salvestamise teekidega: Saate integreerida Django vahemälu raamistiku kolmandate osapoolte vahemällu salvestamise teekidega, nagu `django-redis` ja `django-memcached`, et kasutada nende täiustatud funktsioone ja jõudluse optimeerimisi.
- Tingimuslikud GET päringud: Kasutage HTTP tingimuslikke GET päringuid. Kasutades `ETag` või `Last-Modified` päiseid, saab brauser kontrollida, kas ressurss on muutunud. Kui mitte, vastab server olekukoodiga 304 Not Modified, säästes ribalaiust ja serveri ressursse.
Django vahemälu: kokkuvõte
Vahemälu kasutamine on oluline tehnika Django veebirakenduste jõudluse ja skaleeritavuse parandamiseks. Mõistes erinevaid vahemällu salvestamise strateegiaid, vahemälu tagalaid ja vahemälu tühistamise tehnikaid, saate tõhusalt integreerida vahemälu oma rakendustesse ning pakkuda kiiremat ja reageerivamat kasutajakogemust. Ärge unustage hoolikalt kaaluda oma rakenduse spetsiifilisi nõudeid ja valida sobiv vahemällu salvestamise strateegia ja konfiguratsioon.
Selles juhendis kirjeldatud parimate praktikate järgimisega saate maksimeerida Django vahemälu eeliseid ja luua suure jõudlusega veebirakendusi, mis suudavad käsitleda suurt liiklusmahtu. Jälgige ja optimeerige pidevalt oma vahemällu salvestamise strateegiat, et tagada optimaalne jõudlus ja sujuv kasutajakogemus.